console.log('hello world');

// （常）变量声明
// var, let, const，推荐使用let（变量）和const（常量）
// 数据类型，基本同Python一致
console.log("######################################");
console.log("数据类型");
let v_number = 1;
let v_string = 'hello';
let v_boolean = true;
let v_array = [1, '2', { name: 'hello' }]; // 也可以存放不同类型的数据
console.log("数组：", v_array);
console.log("通过下标访问数组元素v_array[0]=", v_array[0]);
let v_object = { name: 'hello', age: 18, score: [61, 89.5, 76] }; // 定义方式如同Python的字典
console.log("对象：", v_object);
console.log("通过key访问对象元素v_object['name']=", v_object['name'], "或者v_object.name=", v_object.name);
console.log("可以修改对象的值：", v_object['name'] = 'world');
console.log("修改后的对象：", v_object);
const v_const = 1;
// v_const = 2; // 报错



// 条件语句和循环语句，同C语言基本类似
console.log("######################################");
console.log("条件语句");
if (v_number === 1) { // 注意：==是比较值，===是比较值和类型
    console.log('v_number等于1');
}
else {
    console.log('v_number不等于1');
}
console.log("循环语句");
for (let i = 0; i < v_array.length; i++) {
    console.log("数组元素：", v_array[i]);
}




// 函数，同Python也很类似，不需要定义参数类型，更不需要定义返回值类型（虽然也可以：ts）
console.log("######################################");
console.log("函数");
// 可以使用function关键字，也可以使用箭头函数，区别在于this的指向（但你先不用管这个），后续的项目中我们基本都会使用箭头函数
function f1(param) {
    console.log('使用function关键字定义函数', param);
}
f1('hello');

const f2 = (param) => {
    console.log('使用箭头函数定义函数', param);
}
f2();



// 类
console.log("######################################");
console.log("类");
// 类的定义
class Person {
    // 构造函数
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    // 类方法
    sayHello() {
        console.log('hello, my name is', this.name);
    }
}
// 使用类创建对象并调用方法
const p = new Person('zhangsan', 18);
p.sayHello();

// 补充一些类的使用
console.log("js中Set的使用：");
let v_set = new Set([1, 2, 1]);
console.log("Set：", v_set);
v_set.add(3);
console.log("Set添加元素：", v_set);
console.log("Map的使用：");
let v_map = new Map([[1, 'one'], [2, 'two']]);
console.log("Map：", v_map);
console.log("从Map中获取元素：", v_map.get(1));
console.log("向Map中添加元素：", v_map.set(3, 'three'));


// 导入和导出
// 导入默认导出
import myPrint from './util/my_print.js';
// import { myPrint } from './util/my_print.js'; // 错误
myPrint('hello world');
myPrint('hello world');

// 导入非默认导出
import { name, myPrint2 } from './util/my_print2.js';
// import name from './util/my_print2.js'; // 错误
console.log('name:', name);
myPrint2('hello world');